package com.example.juc.kingdom_adventures.term2;

import org.junit.Test;

public class Client {

    private final Object lock = new Object();

    private int number = 0;

    private void read() {
        System.out.println("number = " + number);
    }

    /**
     * 加了锁之后确保write方法是一个原子操作，没有全部执行完成之前不会释放锁，其他线程由于没有锁即便被操作系统调用也无法进入这段代码
     *
     * @param change
     */
    private void write(int change) {
        synchronized (lock) {
            number += change;
        }
    }

    @Test
    public void test() throws InterruptedException {
        // 开启一个线程加 10000 次
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                write(1);
            }
            System.out.println("增加 10000 次已完成");
        }).start();

        // 开启一个线程减 10000 次
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                write(-1);
            }
            System.out.println("减少 10000 次已完成");
        }).start();

        // 睡眠一秒保证线程执行完成
        Thread.sleep(1000);
        // 读取结果
        read();
    }
}

